library(tidyverse)
datos <-
read_csv("./datos/SatisfaccionPacientes.csv") |>
janitor::clean_names()Ejercicio: satisfacción de los pacientes
Práctica guiada (clase 4)
Práctica 1
Para este ejercicio volveremos a usar la tabla de datos de satisfacción de pacientes en un hospital guardada en el archivo .csv llamada SatisfaccionPacientes.csv
Pregunta 1
Imitando la práctica anterior (pero intenta repetirlo sin mirar), trata la variable
estado_saludcomo una cualitativa ORDINAL
Code
datos <-
datos |>
mutate("estado_salud" =
factor(estado_salud, levels = c("Malo", "Regular", "Bueno", "Excelente"),
ordered = TRUE))Pregunta 2
Haz una tabla de frecuencias (absolutas) cruzada entre Género y Estado de salud (en la primera columna estén las opciones para género y en el nombre del resto de columnas las opciones para estado de salud)
Code
# Primero cuento de manera bidimensional con count(var1, var2)
conteo_bidim <-
datos |>
count(genero, estado_salud)
conteo_bidim# A tibble: 7 × 3
genero estado_salud n
<chr> <ord> <int>
1 Femenino Malo 5
2 Femenino Regular 24
3 Femenino Bueno 24
4 Masculino Malo 10
5 Masculino Regular 20
6 Masculino Bueno 16
7 Masculino Excelente 1
Code
# Después pivoto para que use la columna estado_salud
# como futuros nombres de variables (pivota de vertical a horizontal)
# - names_from: de donde saldrán los futuros nombres de columnas
# - values_from: de donde sacamos los valores numéricos (en este caso n)
# para rellenar la tabla
tabla_freq_abs <-
conteo_bidim |> pivot_wider(names_from = estado_salud, values_from = n)
tabla_freq_abs# A tibble: 2 × 5
genero Malo Regular Bueno Excelente
<chr> <int> <int> <int> <int>
1 Femenino 5 24 24 NA
2 Masculino 10 20 16 1
También se puede hacer en R base con table() (que además de ser más sencillo respeta la jerarquía de la ordinal). Moraleja: a veces R base nos facilita la vida, no lo olvidemos.
tabla_freq <- table(datos$genero, datos$estado_salud)
tabla_freq
Malo Regular Bueno Excelente
Femenino 5 24 24 0
Masculino 10 20 16 1
Pregunta 3
Calcula la tabla anterior con frecuencias relativa por filas y por columnas (es decir, dos tablas, una que toda las filas sumen el total, 1, y otra que las columnas sumen el total)
Code
prop.table(tabla_freq, margin = 1)
prop.table(tabla_freq, margin = 2)También se puede hacer en tidyverse calculando antes la suma por filas y por columnas (pero más complicado). Moraleja: tablas de frecuencia podemos hacerlas en tidyverse pero bidimensionales R base nos ayuda mejor. No seamos talibanes de una forma de hacer las cosas, deberemos viajar entre los dos mundos muchas veces
Pregunta 4
Haciendo uso de la tabla anterior contesta a las siguientes preguntas:
¿Qué porcentaje de entre las mujeres, tiene un buen estado de salud?
¿Qué porcentaje de entre los hombres, tiene un estado de salud regular?
¿Qué porcentaje de los que tienen estado de salud malo, son mujeres?
Clicka debajo para ver la respuesta
Code
# De entre las mujeres un 45.28% tiene un buen estado de salud
# De entre los hombres un 34.04% tiene un estado de salud regular
# Un 33.33% de los que tienen un estado de salud malo, son mujeresPregunta 5
Haciendo uso de la tabla de frecuencias del ejercicio 2, ejecuta el código que consideres para responder a la pregunta: ¿están estas dos variables (estado_salud y genero) asociadas? ¿Existe algún tipo de dependencia entre ellas? Hazlo considerando \(\alpha = 0.05\).
Code
# Uno de los contrastes vistos es la prueba de chi-cuadrado
# que nos permite sacar conclusiones sobre la independencia de
# dos variables cualitativas
# chisq.test() nos realiza el contraste haciendo uso de la tabla
# de frecuencias
chisq.test(tabla_freq)Warning in chisq.test(tabla_freq): Chi-squared approximation may be incorrect
Pearson's Chi-squared test
data: tabla_freq
X-squared = 4.2857, df = 3, p-value = 0.2322
Code
# Como el p-value = 0.2322 y alpha = 5%, no podemos rechazar la
# hipótesis nula de independencia: no hay evidencias suficientes
# CON LA MUESTRA QUE TENEMOS para concluir que haya alguna asociación
# entre género y estado de salud
# otra prueba es el Test exacto de Fisher, especialmente útil cuando
# las frecuencias esperadas son bajas.
fisher.test(tabla_freq)
Fisher's Exact Test for Count Data
data: tabla_freq
p-value = 0.1974
alternative hypothesis: two.sided
Code
# Diferente p-valor pero misma conclusiónPregunta 6
Las funciones
chisq.test()yfisher.test()pueden tomar como argumento una tabla de frecuencias ya resumida o puede tomar dos variables y la función ya realiza el conteo. Por ejemplo si hacemos chisq.test(var1, var2) obtenemos un objetohtestque dentro contiene el p-valor.
test_chisq <- chisq.test(datos$genero, datos$estado_salud)Warning in chisq.test(datos$genero, datos$estado_salud): Chi-squared
approximation may be incorrect
names(test_chisq)[1] "statistic" "parameter" "p.value" "method" "data.name" "observed"
[7] "expected" "residuals" "stdres"
Por tanto si aplicamos la función y hacemos después
$p.valuepodemos obtener directamente el valor numérico que nos interesa
chisq.test(datos$genero, datos$estado_salud)$p.valueWarning in chisq.test(datos$genero, datos$estado_salud): Chi-squared
approximation may be incorrect
[1] 0.2322175
¿Cómo usar tidyverse para tener en una tabla resumen ambos p-valores?
Code
tabla_p_valores <-
datos |>
summarise("sig_chisq" = chisq.test(genero, estado_salud)$p.value,
"sig_fisher" = fisher.test(genero, estado_salud)$p.value)Warning: There was 1 warning in `summarise()`.
ℹ In argument: `sig_chisq = chisq.test(genero, estado_salud)$p.value`.
Caused by warning in `chisq.test()`:
! Chi-squared approximation may be incorrect
IMPORTANTE: en muchas ocasiones estos resultados dependerán de la agrupación realizada. Si decidimos reagrupr
Pregunta 7
Cálcula la matriz correlaciones de Pearson entre las variables numéricas. ¿Existe dependencia LINEAL entre la variable edad y el tiempo de espera? (recuerda: correlación de Pearson solo mide asociación lineal)
Code
mat_cor <-
datos |>
select(where(is.numeric)) |>
corrr::correlate()Correlation computed with
• Method: 'pearson'
• Missing treated using: 'pairwise.complete.obs'
Code
# La correlación es de 0.0669 por lo que no parezca exista relaciónDibuja un diagrama de dispersión entre edad y tiempo de espera, incluyendo la recta de regresión, que distinga en los puntos un color distinto por género
Code
ggplot(datos, aes(x = edad, y = tiempo_espera)) +
geom_point(aes(color = genero), size = 2, alpha = 0.7) +
geom_smooth(se = FALSE, method = "lm", color = "#3b9559") +
ggthemes::scale_color_colorblind() +
theme_minimal()`geom_smooth()` using formula = 'y ~ x'
Calcula en una tabla resumen la correlación y el p-valor derivado de un test de correlaciones entre ambas variables
Code
datos |>
summarise("cor" = cor(edad, tiempo_espera),
"sig_cor" = cor.test(edad, tiempo_espera)$p.value)
# No parece existir evidencia significativa de dependencia linealPregunta 8
Repite todo el ejercicio 7 con las variables tiempo de espera y grado de satisfacción
Code
datos |>
select(where(is.numeric)) |>
corrr::correlate()
ggplot(datos, aes(x = grado_satisfaccion, y = tiempo_espera)) +
geom_point(aes(color = genero), size = 2, alpha = 0.7) +
geom_smooth(se = FALSE, method = "lm", color = "#3b9559") +
ggthemes::scale_color_colorblind() +
theme_minimal()
datos |>
summarise("cor" = cor(grado_satisfaccion, tiempo_espera),
"sig_cor" = cor.test(grado_satisfaccion, tiempo_espera)$p.value)
# Sí parece existir evidencia significativa de dependencia lineal
# concretamente negativa: a más espera, menor satisfacción¿Cómo podríamos cambiar mínimamente el código de ggplot para que nos pinte dos rectas (una de cada color), una por cada género?
Code
ggplot(datos,
aes(x = grado_satisfaccion, y = tiempo_espera, color = genero)) +
geom_point(size = 2, alpha = 0.7) +
geom_smooth(se = FALSE, method = "lm") +
ggthemes::scale_color_colorblind() +
theme_minimal()`geom_smooth()` using formula = 'y ~ x'